package com.tdam2013.grupo04.controladores;

import java.util.ArrayList;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Email;

import com.tdam2013.grupo04.datos.DatabaseHelper;
import com.tdam2013.grupo04.modelo.Contacto;

public class ControladorContacto {

	private static ArrayList<Contacto> contactosDb;

	/**
	 * Devuelve la URI de la imagen del contacto
	 * 
	 * @param idContacto
	 * @return
	 */
	public static Uri getImagenContacto(int idContacto) {
		Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.valueOf(idContacto));
		Uri photo = Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
		return photo;
	}

	/**
	 * Busco todos los contactos del telefono, pero solo muestra el nombre y la foto del contacto
	 * 
	 * @param cr
	 *            ContentResolver
	 * @param context
	 *            Context
	 * @return All Contacts
	 */
	public static ArrayList<Contacto> loadAllContactsOnlyNameAndPhoto(ContentResolver cr, Context context) {
		ArrayList<Contacto> allContacts = new ArrayList<Contacto>();
		// Busco todos los contactos almacenados en la base de datos
		DatabaseHelper db = new DatabaseHelper(context);
		contactosDb = db.getContactos();
		// Busco todos los contactos del telefono
		Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
		try {
			while (cursor.moveToNext()) {
				Contacto contact = new Contacto();
				contact.setId(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)));
				contact.setIdProvider(cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID)));
				contact.setNombre(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
				contact.setContactImageUri(getImagenContacto(contact.getIdProvider()));
				contact = obtenerContactoDB(contact);
				allContacts.add(contact);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			cursor.close();
		}
		return allContacts;
	}

	/**
	 * Carga los datos del Contacto
	 * 
	 * @param cr
	 *            ContentResolver
	 * @param contacto
	 * @return Contacto
	 */
	public static Contacto loadContacto(ContentResolver cr, Contacto contacto) {
		Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, ContactsContract.Contacts._ID + "=?",
				new String[] { String.valueOf(contacto.getIdProvider()) }, null);
		try {
			while (cur.moveToNext()) {
				// obtengo el nombre del contacto
				contacto.setNombre(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
				if (cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER) == 1) {
					contacto.setTieneMail(true);
				} else {
					contacto.setTieneMail(false);
				}
				Cursor emailCur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=?",
						new String[] { String.valueOf(contacto.getIdProvider()) }, null);
				try {
					if (emailCur.getCount() == 0) {
						contacto.setTieneMail(false);
					} else {
						contacto.setTieneMail(true);
					}
					while (emailCur.moveToNext()) {
						contacto.addEmail(emailCur.getString(emailCur.getColumnIndex(Email.DATA)), emailCur.getString(emailCur.getColumnIndex(Email.TYPE)));
					}
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					emailCur.close();
				}
				contacto.setContactImageUri(ControladorContacto.getImagenContacto(contacto.getIdProvider()));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			cur.close();
		}
		return contacto;
	}

	/**
	 * Busca el nombre de usuario
	 * 
	 * @param contactoBuscado
	 * @return
	 */
	private static Contacto obtenerContactoDB(Contacto contactoBuscado) {
		int indexContacto = -1;
		for (int i = 0; i < contactosDb.size(); i++) {
			if (contactoBuscado.getIdProvider() == contactosDb.get(i).getIdProvider()) {
				contactoBuscado.setNombreUsuario(contactosDb.get(i).getNombreUsuario());
				indexContacto = i;
				break;
			}
		}
		if (indexContacto != -1) {
			contactosDb.remove(indexContacto);
		}
		return contactoBuscado;
	}
}
